﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace Triangle
{
    public class Search
    {
        public readonly Stack<Node> Stack;
        /// <summary>
        /// </summary>
        /// <param name="node">точка старта-кладется в стек</param>
        public Search(Node node)
        {
            Stack = new Stack<Node>();
            Stack.Push(node);
        }
        /// <summary>
        /// поиск в глубину
        /// </summary>
        /// <param name="node">куда начать поиск</param>
        /// <param name="goal">старт</param>
        public void Dfs(Node node, Node goal)
        {
            if (node.Equals(goal))
            {
                Console.WriteLine("Connected component start from {0} {1}", goal.I, goal.J);
                Map.Paint(Stack.ToList(), false);
            }
            else
                for (int i = 0; i < node.GetNode(Map.GetValueNode(node)).Count; i++)
                {
                    var nd = node.GetNode(Map.GetValueNode(node))[i];
                    if (Stack.Contains(nd)) continue;
                    Stack.Push(nd);
                    Dfs(nd, goal);
                }
        }
    }
    public class Node : IEquatable<Node>
    {
        public int I { get; set;}
        public int J { get; set; }
        public bool Equals(Node node)
        {
            return node.I == I && node.J == J;
        }
        public Node(int i, int j)
        {
            I = i;
            J = j;
        }
        public List<Node> GetNode(int value)
        {
            //var res = new List<Node> {new Node(I - 1, J), new Node(I, J - 1), new Node(I + 1, J), new Node(I, J + 1)};
            var res = new List<Node> { new Node(I - 1, J), new Node(I - 1, J - 1), new Node(I, J - 1), new Node(I + 1, J - 1), new Node(I + 1, J), new Node(I + 1, J + 1), new Node(I, J + 1), new Node(I - 1, J + 1) };
            return res.Where(elem => elem.I >= 0 && elem.I <= 5 && elem.J >= 0 && elem.J <= 6 && Map.Find(elem, value)).ToList();
        }
        public override string ToString()
        {
            return String.Format("Node: x={0} y={1}", I, J);
        }
    }
}
